Skip to content

feat: generate release notes with LLM#77

Merged
crowecawcaw merged 1 commit intoaws-deadline:mainlinefrom
crowecawcaw:feat/bedrock-release-notes
Apr 20, 2026
Merged

feat: generate release notes with LLM#77
crowecawcaw merged 1 commit intoaws-deadline:mainlinefrom
crowecawcaw:feat/bedrock-release-notes

Conversation

@crowecawcaw
Copy link
Copy Markdown

What was the problem/requirement? (What/Why)

Release notes are annoying to write and difficult to write well. But we have lots of good context to form them in the PRs.

What was the solution? (How)

Have an LLM generate the release notes. The change has Opus 4.6 generate the notes. It takes PR descriptions and some instructions and generates a series of bullet points for the notes. The LLM returns notes as strictly typed tool calls, then our script generates the file text from those bullet points.

The script invokes the LLM once, directly, to generate text. It is not running an agent. The LLM does not have the ability to do anything except provide text for the template.

What is the impact of this change?

Better quality release notes with less effort.

How was this change tested?

Two ways:

  1. I ran the script locally with AWS creds and it generated the release notes below.
  2. I pushed changes to my forks, stubbed out the Bedrock call (because I don't have my fork hooked up to an AWS account), and verified the workflow completed successfully and generated correctly formatted notes from the stubbed info

Was this change documented?

n/a

Is this a breaking change?

No


Sample release notes

Features

  • Added support for pre-submission and post-submission hooks in job bundles. Hooks can be defined in
    hooks.yaml or hooks.json in the job bundle directory, or via the DEADLINE_HOOKS_DIR environment variable.
    Pre-submission hooks run before hashing/uploading and can modify the submission, while post-submission hooks
    run after job creation for notifications and integrations. Hooks are disabled by default and require user
    confirmation before execution. (#986)
  • Added --name option to the deadline bundle gui-submit command, allowing you to pre-populate the job name in
    the GUI submitter. This aligns the GUI submit command with the non-GUI bundle submit command. (#1053)

Bug Fixes

  • Fixed an issue on Windows where logging in with Deadline Cloud Monitor could corrupt known paths in the
    ~/.deadline/config file. Path separators are now normalized to prevent different .ini library implementations
    from breaking path configurations. (#1098)
  • Improved the error message when a job output download directory cannot be created (e.g., due to cross-OS
    path incompatibility). Instead of a cryptic OS error, a clear message now explains the failure and suggests
    re-running the download to choose a valid local path. (#1034)
  • Telemetry handler errors are now silently ignored so they no longer cause the CLI or library to malfunction.
    Telemetry is non-essential and will no longer block normal operations if it encounters an error. (#1058)
----

*By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.*

@crowecawcaw crowecawcaw requested a review from a team as a code owner April 17, 2026 21:46
Comment thread .github/scripts/generate_release_notes.py Fixed
karthikbekalp
karthikbekalp previously approved these changes Apr 17, 2026
Copy link
Copy Markdown

@karthikbekalp karthikbekalp left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice! It was always painful to review the changelog. This hopefully makes it easier to review as there is an additional pair of eyes checking this.

Comment thread .github/scripts/generate_release_notes.py
andychoquette
andychoquette previously approved these changes Apr 17, 2026
@crowecawcaw crowecawcaw dismissed stale reviews from andychoquette and karthikbekalp via 82da151 April 17, 2026 21:56
@crowecawcaw crowecawcaw force-pushed the feat/bedrock-release-notes branch from 95c328c to 82da151 Compare April 17, 2026 21:56
@Cherie-Chen
Copy link
Copy Markdown

I think we also need to update workflows/reusable_bump.yml

Also, we could consider removing scripts/get_latest_changelog.py and workflows/reusable_publish.yml

body = json.loads(response["body"].read())

for block in body.get("content", []):
if block.get("type") == "tool_use" and block.get("name") == "emit_release_notes":
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am a little confused about how we are using the emit_release_notes here.

I don't see we have any tool method naming emit_release_notes and seems what we do if the tool is needed is just to return the input's entries ? What's usage of this tool ?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

emit_release_notes is defined in the TOOL_DEFINITION above.

LLMs take a text prompt and a list of "tool definitions" as input and return text and "tool calls" in response. Tool definitions are just JSON schemas and tool calls are just JSON. They're usually wired up to a function call so if the LLM returns a tool call, a function gets called. But more precisely, they're just a mechanism for LLMs to return structured JSON. Here, we're modeling changelog items as tool calls we can be sure each item matches one of the categories and has a reference with it.

@crowecawcaw crowecawcaw force-pushed the feat/bedrock-release-notes branch from 82da151 to 4f011f0 Compare April 17, 2026 22:33
Add .github/scripts/generate_release_notes.py which uses Bedrock
(Claude Opus 4.6 via cross-region inference) to generate customer-facing
release notes from git commits and PR descriptions using LLM tool use.

Update reusable_bump.yml to use Bedrock-generated notes instead of
scraping raw CHANGELOG.md entries via get_latest_changelog.py. The
release workflows (reusable_release.yml, reusable_publish_v2.yml)
continue to read from CHANGELOG.md so the GitHub release body always
matches the committed changelog.

Requires bedrock:InvokeModel permission on the OpenPGPOIDCRole
(BealineClientSoftwareCDK CR-268154405, already merged).

Signed-off-by: Stephen Crowe <6042774+crowecawcaw@users.noreply.github.com>
@crowecawcaw crowecawcaw force-pushed the feat/bedrock-release-notes branch from 4f011f0 to fcace00 Compare April 17, 2026 22:34
@crowecawcaw
Copy link
Copy Markdown
Author

@Cherie-Chen good catch! Revised. I also tested the bump workflow from my fork which generated this PR: crowecawcaw/deadline-cloud#4
I also manually ran some of the release workflow steps to generate this release: https://github.com/crowecawcaw/deadline-cloud/releases/tag/0.55.2

@crowecawcaw crowecawcaw merged commit 056a284 into aws-deadline:mainline Apr 20, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants